home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_09_12
/
9n12118a
< prev
next >
Wrap
Text File
|
1991-10-19
|
2KB
|
76 lines
/* LISTING 10 - CIRCLE.C */
/* CIRCLE PACKAGE - contains CIRCLE typedef,
private data and action package
definitions */
#include <stdlib.h>
/* CIRCLE type has only two elements */
typedef struct circle
{
/* void * pointer to private data */
void *pprivate;
/* pcact is used as a pointer to an
array of action functions */
int (**pcact)();
} CIRCLE;
/* private data struct is static */
static struct circle_pri_data
{
int color;
};
/* get and setcolor member functions */
static int cir_get_color(CIRCLE *pc)
{
return
((struct circle_pri_data *)
(pc->pprivate))->color;
}
static int cir_set_color(CIRCLE *pc, int col)
{
((struct circle_pri_data *)
(pc->pprivate))->color = col;
}
/* now define and initialize action package */
static (*cact[])() =
{ circle_getcolor, circle_setcolor };
/* the constructor is public, callable from
another file the constructor creates
space for the private data, and inits
the new circle's action pointer to the
action package */
constructor(CIRCLE *pc, int color)
{
/* first make space for the private data */
if (!(pc->pprivate =
malloc(sizeof(struct circle_pri_data))))
exit(-1);
/* cast pprivate to point to private data
to set color */
((struct circle_pri_data *)
(pc->pprivate))->color = color;
/* finally, hook up the new circle to the
action package */
pc->pact = cact;
}
/* the public destructor frees the allocated
private storage */
destructor(CIRCLE *pc) {
free(pc->pprivate);
}